04 - 读取路径:向量、图与结构化
前置:02 篇的纯追加写入、03 篇的作废语义。库里现在有一堆条目,其中有些已作废、有些互相矛盾。
本篇回答:在用户等回复的那几十毫秒里,怎么从这堆条目里挑出该用的三到十条,以及挑出来之后放在请求的哪个位置。
本篇会用到的词:
| 词 | 意思 |
|---|---|
| BM25 | 一种基于词频的经典文本检索算法。它匹配的是字面词,正好补上向量检索对专有名词不敏感的短板 |
| RRF | 倒数排名融合。把多路检索的结果按各自排名的倒数加权合并,不需要各路分数可比 |
| MMR | 最大边际相关性。在"跟查询相关"和"跟已选结果不重复"之间取平衡,用来去掉一批意思相同的结果 |
| 交叉编码器 | 把查询和候选拼在一起送进模型打分的重排器。比向量点积准,但要为每个候选跑一次模型 |
| 前缀缓存 | 模型服务对请求前缀的缓存。前缀有一个字节变化,后面全部要重算 |
| 召回预算 | 允许注入上下文的记忆条数或 token 数上限 |
一、检索的查询不是用户那句话
最常见的实现是拿用户当前输入直接去检索。它在两类场景下必然失败:
折中方案:只在检测到指代词("那个""上次""他")时才走 C,其余走 A。一个正则或轻量分类器就能做这个分流,代价接近零。
二、纯向量检索的四类失效
向量检索在记忆场景下的失效模式和在文档 RAG 里不太一样,因为记忆条目短、同质、且带时间属性。